/* 
 *阅读jquery的源码不是为了理解jquery的方法怎么用，而是为了理解jquery为什么能够这样写
 *其中你会发现其中其中的乐趣所在，当然只有你知道他是怎么用的你才会有兴趣去了解他为什么怎么实现的
 *
 * jQuery源码分析-extend函数 
 * jQuery版本:1.5.1 
 *  
 * ---------------------------------------------------------- 
 * 函数介绍 
 * jQuery.extend与jQuery.fn.extend指向同一个函数对象 
 * jQuery.extend是jQuery的属性函数(静态方法) 
 * jQuery.fn.extend是jQuery函数所构造对象的属性函数(对象方法) 
 * 
 * ---------------------------------------------------------- 
 * 使用说明 
 * extend函数根据参数和调用者实现功能如下： 
 * 1.对象合并: 
 * 对象合并不区分调用者,jQuery.extend与jQuery.fn.extend完全一致 
 * 也就是说对jQuery对象本身及jQuery所构造的对象没有影响 
 * 对象合并根据参数区分,参数中必须包括两个或两个以上对象 
 * 如:$.extend({Object}, {Object}) 或 $.extend({Boolean},{Object}, {Object}) 
 * 对象合并返回最终合并后的对象,支持深度拷贝 
 *  
 * 2.为jQuery对象本身增加方法: 
 * 这种方式从调用者和参数进行区分 
 * 形式为 $.extend({Object}) 
 * 这种方式等同于 jQuery.{Fnction Name} 
 *  
 * 3.原型继承: 
 * 原型继承方式可以为jQuery所构造的对象增加方法 
 * 这种方式也通过调用者和参数进行区分 
 * 形式为 $.fn.extend({Object}) 
 * 这种方式实际上是将{Object}追加到jQuery.prototype,实现原型继承 
 *  
 * ---------------------------------------------------------- 
 *  
 */
MyQuery = {};
MyQuery.extend = function() {
	var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// 传递进来的第一个参数赋给target 如果target是布尔类型的，说明该参数是深拷贝参数
	if (typeof target === "boolean") {
		deep = target;
		// 第一个不是目标对象 则第二个是目标对象，如果第二个也为空的话创建一个空对象
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	// Handle case when target is a string or something (possible in deep copy)
	// 当目标对象是字符串或者一些特殊情况 给target对象重新赋成一个控对象
	if (typeof target !== "object" && !jQuery.isFunction(target)) {
		target = {};
	}

	// 如果只有一个参数 继承的目标对象真为jquery本身
	if (length === i) {
		target = this;
		--i;
	}
	//这里从第二个参数开始迭代
	for (; i < length; i++) {
		// 只处理不为空的参数Only deal with non-null/undefined values
		if ((options = arguments[i]) != null) {
			// Extend the base object
			for (name in options) {
				src = target[name];
				copy = options[name];
				log(copy);
				//防止循环引用进入到死循环 Prevent never-ending loop
				if (target === copy) {
					continue;
				}

				// 符合以下条件则递归拷贝子对象 
				//深度拷贝参数为true 
				//目标对象不为空,就是copy对象
				//并且是纯对象，纯对象就是通过{} 或者new Object创建的对象
				//并且对象为数组
				if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
					if (copyIsArray) {
						copyIsArray = false;
						clone = src && jQuery.isArray(src) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject(src) ? src : {};
					}
					// Never move original objects, clone them
					target[name] = jQuery.extend(deep, clone, copy);
					// Don't bring in undefined values
				} else if (copy !== undefined) {
					target[name] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

var object1 = {
	apple: 0,
	banana: {
		weight: 52,
		price: 100
	},
	cherry: 97
};
var object2 = {
	banana: {
		price: 200
	},
	durian: 100
};

MyQuery.extend(object1, object2);
log(object1);